#include "xmlHelper.h"
#include "xmlNodeTree.h"

namespace lpe{
	namespace resman{
		XMLHelper::XMLHelper(const std::string& fileName)
			:m_fileName(fileName)
			,m_appender("[XML_APPENDER]")
			,m_rootNode(NULL)
		{}

		XMLHelper::~XMLHelper()
		{
			delete m_rootNode;
		}
		void XMLHelper::init(const std::string& APPENDER)
		{

			// primero inicializamos el log. No le añadimos un listener por que de eso se tiene que encargar el usuario.
			m_log = &glog::CGlobalLog::getSingleton();
			m_appender = APPENDER;
			m_log->addAppender(m_appender);

			// asignamos la ruta completa al fichero que debemos abir
			m_fileName = boost::filesystem::system_complete(boost::filesystem::path(m_fileName)).string();
			// abrimos el fichero XML
			openXMLFile();

		}
		bool XMLHelper::openXMLFile()
		{
			if(!boost::filesystem::exists(boost::filesystem::path(m_fileName)))
			{
				std::stringstream ss;
				ss << "Error en la carga del fichero: No se ha podido encontrar "<< m_fileName <<".\n";
				THROW_AND_LOG(m_appender,lpe::core::fileNotFoundException, ss.str());
				return false;
			}
			TiXmlDocument xfile(m_fileName.c_str());

			xfile.LoadFile();
			if(xfile.Error())
			{
				std::stringstream ss;
				ss << "Error en la carga del fichero "<< m_fileName <<". Descripcion:\n\t"<< xfile.ErrorDesc() <<" \n\tlinea: "<< xfile.ErrorRow();
				THROW_AND_LOG(m_appender,lpe::core::xmlParsingException, ss.str());
				return false;
			}
			// Comprobar que la cabecera sea standar y tenga: <?xml version="1.0" encoding="ISO-8859-1"?>
			/*
			if(xfile.FirstChild()->Type() == TiXmlNode::TINYXML_DECLARATION)
			{
				m_rootNode = new XMLNodeTree();
				m_rootNode->readNode(xfile.FirstChild()->NextSibling());
				//m_rootNode->printNodeTree("\t");
			}else
			{
				// si no lleva la cabecera
				if(xfile.FirstChild()->Type() == TiXmlNode::TINYXML_ELEMENT)
				{
					m_rootNode = new XMLNodeTree();
					m_rootNode->readNode(xfile.FirstChild());
				}else
				{
					THROW_AND_LOG(RESMAN_APP,lpe::core::xmlParsingException,)
				}
			}
			*/
			switch(xfile.FirstChild()->Type())
			{
				case TiXmlNode::TINYXML_DECLARATION:
					m_rootNode = new XMLNodeTree();
					m_rootNode->readNode(xfile.FirstChild()->NextSibling());
					break;
				case TiXmlNode::TINYXML_ELEMENT:
					m_log->WARNING_MSG(m_appender,"El archivo %s no tiene prologo", m_fileName.c_str());
					m_rootNode = new XMLNodeTree();
					m_rootNode->readNode(xfile.FirstChild());
					break;
				case TiXmlNode::TINYXML_TEXT:
				case TiXmlNode::TINYXML_COMMENT:
					break;
				case TiXmlNode::TINYXML_TYPECOUNT:
				case TiXmlNode::TINYXML_UNKNOWN:
				case TiXmlNode::TINYXML_DOCUMENT:
					m_log->WARNING_MSG(m_appender,"Es posible que el documento este mal formateado. No se encuentran elementos parseables.");
					break;
			}
			return true;
		}
		XMLNodeTree* XMLHelper::getXMLRootNode()
		{
			return m_rootNode;
		}

	};
};
